/**
 * @file kwdb_client.h
 * @brief KWDB客户端主类 - 基于gRPC的高性能SDK
 */

#ifndef KWDB_CLIENT_H
#define KWDB_CLIENT_H

#include "config.h"
#include "data_point.h"
#include "query_result.h"
#include "query_builder.h"
#include "grpc_client.h"
#include "batch_writer.h"
#include "line_protocol_parser.h"
#include "exceptions.h"

#include <memory>
#include <vector>
#include <future>
#include <thread>
#include <atomic>

namespace kwdb {

/**
 * @brief KWDB客户端主类
 * 
 * 提供完整的KWDB数据库操作接口，包括：
 * - 数据写入（单条、批量、流式）
 * - 数据查询（SQL、流式查询）
 * - 连接管理
 * - 异步操作
 */
class KWDBClient {
public:
    /**
     * @brief 构造函数
     * @param config 客户端配置
     */
    explicit KWDBClient(const ClientConfig& config);
    
    /**
     * @brief 析构函数
     */
    ~KWDBClient();
    
    /**
     * @brief 连接到KWDB服务器
     * @throws KWDBException 连接异常
     */
    void connect();
    
    /**
     * @brief 断开连接
     */
    void disconnect();
    
    /**
     * @brief 写入单条数据点
     * @param dataPoint 数据点
     * @throws KWDBException 写入异常
     */
    void write(const DataPoint& dataPoint);
    
    /**
     * @brief 异步写入单条数据点
     * @param dataPoint 数据点
     * @return std::future<void>
     */
    std::future<void> writeAsync(const DataPoint& dataPoint);
    
    /**
     * @brief 批量写入数据点
     * @param dataPoints 数据点列表
     * @throws KWDBException 写入异常
     */
    void writeBatch(const std::vector<DataPoint>& dataPoints);
    
    /**
     * @brief 异步批量写入数据点
     * @param dataPoints 数据点列表
     * @return std::future<void>
     */
    std::future<void> writeBatchAsync(const std::vector<DataPoint>& dataPoints);
    
    /**
     * @brief 流式写入数据点
     * @param dataPoints 数据点列表
     * @return std::future<void>
     */
    std::future<void> writeStreamAsync(const std::vector<DataPoint>& dataPoints);
    
    /**
     * @brief 执行SQL查询
     * @param sql SQL语句
     * @return 查询结果
     * @throws KWDBException 查询异常
     */
    QueryResult query(const std::string& sql);
    
    /**
     * @brief 异步执行SQL查询
     * @param sql SQL语句
     * @return std::future<QueryResult>
     */
    std::future<QueryResult> queryAsync(const std::string& sql);
    
    /**
     * @brief 流式查询
     * @param sql SQL语句
     * @return std::future<QueryResult>
     */
    std::future<QueryResult> queryStreamAsync(const std::string& sql);
    
    /**
     * @brief 创建查询构建器
     * @return QueryBuilder
     */
    QueryBuilder queryBuilder();
    
    /**
     * @brief 解析Line Protocol格式数据
     * @param lineProtocol Line Protocol字符串
     * @return DataPoint
     */
    DataPoint parseLineProtocol(const std::string& lineProtocol);
    
    /**
     * @brief 将数据点转换为Line Protocol格式
     * @param dataPoint 数据点
     * @return Line Protocol字符串
     */
    std::string toLineProtocol(const DataPoint& dataPoint);
    
    /**
     * @brief 检查连接状态
     * @return 是否已连接
     */
    bool isConnected() const;
    
    /**
     * @brief 获取客户端配置
     * @return ClientConfig
     */
    const ClientConfig& getConfig() const;
    
    /**
     * @brief 获取批量写入器
     * @return BatchWriter
     */
    BatchWriter& getBatchWriter();
    
    /**
     * @brief 健康检查
     * @return 是否健康
     */
    bool healthCheck();

private:
    ClientConfig config_;
    std::unique_ptr<GrpcClient> grpcClient_;
    std::unique_ptr<BatchWriter> batchWriter_;
    std::unique_ptr<LineProtocolParser> parser_;
    std::atomic<bool> connected_;
    
    // 线程池
    std::vector<std::thread> threadPool_;
    std::atomic<bool> shutdown_;
    
    /**
     * @brief 初始化线程池
     */
    void initializeThreadPool();
    
    /**
     * @brief 关闭线程池
     */
    void shutdownThreadPool();
};

} // namespace kwdb

#endif // KWDB_CLIENT_H
